package com.demo.common.config;

import java.util.Date;
import java.util.Properties;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.wall.WallFilter;
import com.demo.common.model._MappingKit;
import com.demo.controller.index.IndexController;
import com.demo.controller.itjson.ITjsonController;
import com.demo.core.freemarker.tags.ActionDirective;
import com.demo.core.statics.Constant;
import com.demo.controller.blog.BlogController;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.ext.handler.FakeStaticHandler;
import com.jfinal.handler.Handler;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.druid.DruidStatViewHandler;
import com.jfinal.render.FreeMarkerRender;

import freemarker.template.TemplateModelException;

/**
 * API引导式配置
 */
public class DemoConfig extends JFinalConfig {
	
	/**
	 * 配置常量
	 */
	public void configConstant(Constants me) {
		// 加载少量必要配置，随后可用PropKit.get(...)获取值
		PropKit.use("jdbc.properties");
		me.setDevMode(PropKit.getBoolean("devMode", false));
		//设置ftl文件的基本位置，默认为根目录，如：WebRoot
		me.setBaseViewPath("/WEB-INF/ftl");
		//设置文件的后缀为.ftl的，默认为html
		me.setFreeMarkerViewExtension("ftl");
		me.setError404View("/WEB-INF/ftl/common/404.ftl");
		me.setError500View("/WEB-INF/ftl/common/500.ftl");
		me.setBaseDownloadPath("/");
	}
	
	/**
	 * 配置路由
	 */
	public void configRoute(Routes me) {
		me.add("/", IndexController.class, "/itjson");	// 第三个参数为该Controller的视图存放路径
		me.add("/blog", BlogController.class);			// 第三个参数省略时默认与第一个参数值相同，在此即为 "/blog"
		me.add("/itjson", ITjsonController.class);			// 第三个参数省略时默认与第一个参数值相同，在此即为 "/itjson"
	}
	
	
	/**
	 * 配置插件
	 */
	public void configPlugin(Plugins me) {
//		// 配置C3p0数据库连接池插件
//		C3p0Plugin C3p0Plugin = createC3p0Plugin();
//		me.add(C3p0Plugin);

		//实例化DruidPlugin数据源
		DruidPlugin druidPlugin = createDruidPlugin();
		//配置DruidPlugin过滤器
		druidPlugin.addFilter(new StatFilter());
		WallFilter wall = new WallFilter();
		wall.setDbType("mysql");
		druidPlugin.addFilter(wall);
		me.add(druidPlugin);
		
		// 配置ActiveRecord插件
		ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
		me.add(arp);
		
		// 所有配置在 MappingKit 中搞定
		_MappingKit.mapping(arp);
	}
	
	/**
	 * 配置全局拦截器
	 */
	public void configInterceptor(Interceptors me) {
		
	}
	
	/**
	 * 配置处理器
	 */
	public void configHandler(Handlers me) {
		//配置druid访问url
		DruidStatViewHandler dvh =  new DruidStatViewHandler("/druid");
		me.add(dvh);
		
		//添加伪静态后缀
		me.add(new FakeStaticHandler(".html"));
		
		//http://localhost/u/login;jsessionid=96zdtkxja35saw3gg2e4nv3v 当使用shiro的时候，重定向会再url上加：jsessionid=XX，这样控制器就找不到了，使用下面这段可以解决这个问题
		me.add(new SessionHandler());
	}
	
	
	/** 
	 * jfinal启动后加载
	 * */
	public void afterJFinalStart() {
		Properties p = loadPropertyFile("freemarker.properties");;//由于我们用到freemarker，所以在此进行freemarker配置文件的装载  
		FreeMarkerRender.setProperties(p);
	}
	
	/**
	 * 建议使用 JFinal 手册推荐的方式启动项目
	 * 运行此 main 方法可以启动项目，此main方法可以放置在任意的Class类定义中，不一定要放于此
	 */
	public static void main(String[] args) {
		JFinal.start("WebRoot", 85, "/", 5);
	}
	
	
	//创建C3p0数据源
	public static C3p0Plugin createC3p0Plugin() {
		return new C3p0Plugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());
	}
	
	//创建druid数据源
	public static DruidPlugin createDruidPlugin(){
		return new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password"));
	}
}



/**   
 * @ClassName:  SessionHandler   
 * @Description:TODO(http://localhost/u/login;jsessionid=96zdtkxja35saw3gg2e4nv3v 当使用shiro的时候，重定向会再url上加：jsessionid=XX，这样控制器就找不到了，使用下面这段可以解决这个问题)   
 * @author: Soywer  
 * @date:   2016年7月5日 下午3:10:01   
 *      
 */  
class SessionHandler extends Handler {

	/**   
	 * <p>Title: handle</p>   
	 * <p>Description: </p>   
	 * @param target
	 * @param request
	 * @param response
	 * @param isHandled   
	 * @see com.jfinal.handler.Handler#handle(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, boolean[])   
	 */  
	@Override
	public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
		try {
			
			FreeMarkerRender.getConfiguration().setSharedVariable(Constant.CONTEXT_PATH,request.getContextPath());
			FreeMarkerRender.getConfiguration().setSharedVariable("_time",new Date().getTime());
			FreeMarkerRender.getConfiguration().setSharedVariable("_v", Constant.VERSION);//版本号，重启的时间
			FreeMarkerRender.getConfiguration().setSharedVariable("cdn", Constant.DOMAIN_CDN);
			FreeMarkerRender.getConfiguration().setSharedVariable("www", Constant.DOMAIN_WWW);
			//自定义标签
			FreeMarkerRender.getConfiguration().setSharedVariable("_itjson_tags", new ActionDirective()); 
		} catch (TemplateModelException e) {
			e.printStackTrace();
		}
		
	    int index = target.indexOf(";jsessionid");
	    if (index != -1) {
	    	target = target.substring(0, index);
	    }
	    index = target.indexOf(";JSESSIONID");
	    if (index != -1) {
	    	target = target.substring(0, index);
	    }
	    nextHandler.handle(target, request, response, isHandled);
	}
	
}
